Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_licenses_collector.py

Displaying Raw • Download


tests/backend/test_licenses_collector.py v4.6.0-rc.2 (7bbe9846) Text, 6.00 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3patch

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787licenses_collector Tff7b72import Tb4b4b4(
Te6edf3_filter_out_workspace_root_packageTb4b4b4,
Te6edf3_flatten_pnpm_licenses_jsonTb4b4b4,
Te6edf3build_licenses_payloadTb4b4b4,
Te6edf3collect_frontend_from_node_modulesTb4b4b4,
Te6edf3render_third_party_noticesTb4b4b4,
Te6edf3write_embedded_license_artifactsTb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_flatten_pnpm_licenses_json_maps_and_sortsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffzebra-pkgTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionsTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ff2.0.0Ta5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffZTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffApache-2.0Ta5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffalpha-pkgTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionsTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAliceTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffno-versionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionsTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff—Ta5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Te6edf3rows Tff7b72= Te6edf3_flatten_pnpm_licenses_jsonTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72assert Tb4b4b4[Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3rowsTb4b4b4] Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffalpha-pkgTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffno-versionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffzebra-pkgTa5d6ff"Tb4b4b4]
Te6edf3alpha Tff7b72= Tffa657nextTb4b4b4(Te6edf3r Tff7b72for Te6edf3r Tff7b72in Te6edf3rows Tff7b72if Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffalpha-pkgTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3alphaTb4b4b4[Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"
Tff7b72assert Te6edf3alphaTb4b4b4[Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffAliceTa5d6ff"
Tff7b72assert Te6edf3alphaTb4b4b4[Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffApache-2.0Ta5d6ff"
Te6edf3nov Tff7b72= Tffa657nextTb4b4b4(Te6edf3r Tff7b72for Te6edf3r Tff7b72in Te6edf3rows Tff7b72if Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffno-versionTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3novTb4b4b4[Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff?Ta5d6ff"


Tff7b72def Td2a8fftest_filter_out_workspace_root_package_drops_app_not_depsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpackage.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffmy-appTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Ta5d6ff}Tffea00\nTa5d6ff'Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3rows Tff7b72= Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmy-appTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffXTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffleft-padTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffYTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Te6edf3out Tff7b72= Te6edf3_filter_out_workspace_root_packageTb4b4b4(Te6edf3rowsTb4b4b4, Te6edf3tmp_pathTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3outTb4b4b4) Tff7b72== T79c0ff1
Tff7b72assert Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffleft-padTa5d6ff"


Tff7b72def Td2a8fftest_collect_frontend_from_node_modules_dedupes_and_reads_licenseTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3nm Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffnode_modulesTa5d6ff"
Tb4b4b4(Te6edf3nm Tff7b72/ Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4(Te6edf3nm Tff7b72/ Ta5d6ff"Ta5d6ffalphaTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffpackage.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffalphaTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fflicenseTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffMITTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffauthorTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffATa5d6ff"Ta5d6ff}Ta5d6ff'Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4(Te6edf3nm Tff7b72/ Ta5d6ff"Ta5d6ffnestedTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4(Te6edf3nm Tff7b72/ Ta5d6ff"Ta5d6ffnestedTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffbetaTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffpackage.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffbetaTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff2.0.0Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fflicenseTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6fftypeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffApache-2.0Ta5d6ff"Ta5d6ff}}Ta5d6ff'Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3rows Tff7b72= Te6edf3collect_frontend_from_node_modulesTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3names Tff7b72= Tb4b4b4[Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3r Tff7b72in Te6edf3rowsTb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffalphaTa5d6ff" Tff7b72in Te6edf3names Tff7b72and Ta5d6ff"Ta5d6ffbetaTa5d6ff" Tff7b72in Te6edf3names
Te6edf3beta Tff7b72= Tffa657nextTb4b4b4(Te6edf3r Tff7b72for Te6edf3r Tff7b72in Te6edf3rows Tff7b72if Te6edf3rTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3betaTb4b4b4[Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffApache-2.0Ta5d6ff"


Tff7b72def Td2a8fftest_flatten_pnpm_licenses_json_non_dict_package_skippedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffnot-a-dictTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionsTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4}Tb4b4b4]Tb4b4b4}
Te6edf3rows Tff7b72= Te6edf3_flatten_pnpm_licenses_jsonTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3rowsTb4b4b4) Tff7b72== T79c0ff1
Tff7b72assert Te6edf3rowsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffokTa5d6ff"


Tff7b72def Td2a8fftest_build_licenses_payload_composes_counts_and_metaTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3be Tff7b72= Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrnsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4]
Te6edf3fe Tff7b72= Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4]
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.licenses_collector.collect_backend_licensesTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3beTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.licenses_collector.collect_frontend_licensesTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tb4b4b4(Te6edf3feTb4b4b4, Ta5d6ff"Ta5d6ffpnpmTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Te6edf3build_licenses_payloadTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3be
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3fe
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffbackend_countTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffrontend_countTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffrontend_sourceTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpnpmTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffgenerated_atTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffZTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_render_third_party_notices_contains_sections_and_rowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrnsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAuthor ATa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff3.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAuthor BTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffgenerated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2026-01-01T00:00:00ZTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrontend_sourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpnpmTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3rendered Tff7b72= Te6edf3render_third_party_noticesTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffReticulum MeshChatX - Third-party noticesTa5d6ff" Tff7b72in Te6edf3rendered
Tff7b72assert Ta5d6ff"Ta5d6ffPython dependenciesTa5d6ff" Tff7b72in Te6edf3rendered
Tff7b72assert Ta5d6ff"Ta5d6ffNode dependenciesTa5d6ff" Tff7b72in Te6edf3rendered
Tff7b72assert Ta5d6ff"Ta5d6ffrns 1.0Ta5d6ff" Tff7b72in Te6edf3rendered
Tff7b72assert Ta5d6ff"Ta5d6ffvue 3.0Ta5d6ff" Tff7b72in Te6edf3rendered


Tff7b72def Td2a8fftest_write_embedded_license_artifacts_writes_filesTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrnsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflicenseTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMITTa5d6ff"Tb4b4b4}Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffgenerated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2026-01-01T00:00:00ZTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrontend_sourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpnpmTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.licenses_collector.build_licenses_payloadTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3payloadTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3write_embedded_license_artifactsTb4b4b4(Te6edf3repo_rootTff7b72=Te6edf3tmp_pathTb4b4b4)

Te6edf3frontend_path Tff7b72= Te6edf3PathTb4b4b4(Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffrontend_pathTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3notices_path Tff7b72= Te6edf3PathTb4b4b4(Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffnotices_pathTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3frontend_pathTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3notices_pathTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff'Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff: Ta5d6ff"Ta5d6ffvueTa5d6ff"Ta5d6ff' Tff7b72in Te6edf3frontend_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffReticulum MeshChatX - Third-party noticesTa5d6ff" Tff7b72in Te6edf3notices_pathTff7b72.Td2a8ffread_textTb4b4b4(
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Tb4b4b4)


Tff7b72def Td2a8fftest_write_embedded_license_artifacts_preserves_existing_frontend_when_emptyTb4b4b4(
Te6edf3tmp_pathTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3data_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffmeshchatxTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffdataTa5d6ff"
Te6edf3data_dirTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3frontend_path Tff7b72= Te6edf3data_dir Tff7b72/ Ta5d6ff"Ta5d6fflicenses_frontend.jsonTa5d6ff"
Te6edf3frontend_pathTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff'Ta5d6ff[Ta5d6ff{Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffkeptTa5d6ff"Ta5d6ff}]Tffea00\nTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffgenerated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2026-01-01T00:00:00ZTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrontend_sourceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.licenses_collector.build_licenses_payloadTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3payloadTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3write_embedded_license_artifactsTb4b4b4(Te6edf3repo_rootTff7b72=Te6edf3tmp_pathTb4b4b4)

Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffrontend_writtenTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3frontend_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff'Ta5d6ff[Ta5d6ff{Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffkeptTa5d6ff"Ta5d6ff}]Tffea00\nTa5d6ff'


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────